import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
// 引入 node 提供内置模块 path，可以获取绝对路径
import { resolve } from "path";
// 引入 uno css 插件
import UnoCSS from "unocss/vite";
// 导入 unplugin-icons 插件
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";
// 导入 uno css 配置文件
import { collections } from "./uno.config";
// 按需导入插件
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
// element-plus 解析插件
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";

// src 源路径
const pathSrc = resolve(__dirname, "./src");

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    UnoCSS(),
    Icons({
      compiler: "vue3",
      customCollections: collections,
      // 开启按需导入
      autoInstall: true,
    }),
    // 自动导入配置 https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts
    AutoImport({
      // 导入 Vue 函数，如：ref, reactive, toRef 等
      imports: [
        "vue",
        "pinia",
        "vue-router",
        { axios: [["default", "axios"]] },
        "@vueuse/core",
        "vue-i18n",
      ],
      resolvers: [
        // 导入 Element Plus函数，如：ElMessage, ElMessageBox 等
        ElementPlusResolver({ importStyle: "sass" }),
        // Auto import icon components
        // 自动导入图标组件
        IconsResolver({
          prefix: "Icon",
        }),
      ],
      eslintrc: {
        enabled: false,
        filepath: "./.eslintrc-auto-import.json",
        globalsPropValue: true,
      },
      vueTemplate: true,
      // 导入函数类型声明文件路径 (false:关闭自动生成)
      // dts: false,
      dts: resolve(pathSrc, "./types/auto-imports.d.ts"),
    }),
    Components({
      resolvers: [
        // 导入 Element Plus 组件
        ElementPlusResolver({ importStyle: "sass" }),
        // 自动注册图标组件
        IconsResolver({
          enabledCollections: ["ep"],
        }),
      ],
      // 指定自定义组件位置(默认:src/components)
      dirs: ["src/components", "src/**/components"],
      // 导入组件类型声明文件路径 (false:关闭自动生成)
      // dts: false,
      dts: resolve(pathSrc, "./types/components.d.ts"),
    }),
  ],
  server: {
    // 自定义主机 IP
    host: "127.0.0.1",
    // 自定义端口
    port: 8081,
    // 配置代理
    proxy: {
      // 配置需要代理的路径 --> 这里的意思是代理http://localhost:8081后的所有路由
      "/api": {
        // 目标地址 --> 服务器地址
        target: "http://127.0.0.1:3000/",
        // 允许跨域
        changeOrigin: true,
        // 替换 API
        // rewrite: (path: string) => path.replace(/^\/api/, ''),
        rewrite: (path) => {
          const newPath = path.replace(/^\/api/, "");
          console.log("Original:", path, "Rewritten:", newPath); // 调试用
          return newPath;
        },
      },
    },
  },
  resolve: {
    // 设置@为src目录
    alias: {
      "@": pathSrc,
    },
  },
  css: {
    // 全局引入变量文件（路径根据项目调整）
    preprocessorOptions: {
      scss: {
        additionalData: `@use "@/styles/variables.scss" as *;`,
      },
    },
  },
  // 预加载项目必需的组件
  optimizeDeps: {
    include: [
      "vue",
      "vue-router",
      "element-plus",
      "pinia",
      "axios",
      "lodash-es",
      "qs",
      "@vueuse/core",
      "echarts/core",
      "echarts/renderers",
      "echarts/charts",
      "echarts/components",
      "vue-i18n",
      "@element-plus/icons-vue",
      "element-plus/es",
      "element-plus/es/locale/lang/en",
      "element-plus/es/locale/lang/zh-cn",
      "element-plus/es/components/alert/style/index",
      "element-plus/es/components/avatar/style/index",
      "element-plus/es/components/backtop/style/index",
      "element-plus/es/components/badge/style/index",
      "element-plus/es/components/base/style/index",
      "element-plus/es/components/breadcrumb-item/style/index",
      "element-plus/es/components/breadcrumb/style/index",
      "element-plus/es/components/button/style/index",
      "element-plus/es/components/card/style/index",
      "element-plus/es/components/checkbox-group/style/index",
      "element-plus/es/components/checkbox/style/index",
      "element-plus/es/components/col/style/index",
      "element-plus/es/components/color-picker/style/index",
      "element-plus/es/components/config-provider/style/index",
      "element-plus/es/components/date-picker/style/index",
      "element-plus/es/components/descriptions-item/style/index",
      "element-plus/es/components/descriptions/style/index",
      "element-plus/es/components/dialog/style/index",
      "element-plus/es/components/divider/style/index",
      "element-plus/es/components/drawer/style/index",
      "element-plus/es/components/dropdown-item/style/index",
      "element-plus/es/components/dropdown-menu/style/index",
      "element-plus/es/components/dropdown/style/index",
      "element-plus/es/components/empty/style/index",
      "element-plus/es/components/form-item/style/index",
      "element-plus/es/components/form/style/index",
      "element-plus/es/components/icon/style/index",
      "element-plus/es/components/image-viewer/style/index",
      "element-plus/es/components/image/style/index",
      "element-plus/es/components/input-number/style/index",
      "element-plus/es/components/input-tag/style/index",
      "element-plus/es/components/input/style/index",
      "element-plus/es/components/link/style/index",
      "element-plus/es/components/loading/style/index",
      "element-plus/es/components/menu-item/style/index",
      "element-plus/es/components/menu/style/index",
      "element-plus/es/components/message-box/style/index",
      "element-plus/es/components/message/style/index",
      "element-plus/es/components/notification/style/index",
      "element-plus/es/components/option/style/index",
      "element-plus/es/components/pagination/style/index",
      "element-plus/es/components/popover/style/index",
      "element-plus/es/components/progress/style/index",
      "element-plus/es/components/radio-button/style/index",
      "element-plus/es/components/radio-group/style/index",
      "element-plus/es/components/radio/style/index",
      "element-plus/es/components/row/style/index",
      "element-plus/es/components/scrollbar/style/index",
      "element-plus/es/components/select/style/index",
      "element-plus/es/components/skeleton-item/style/index",
      "element-plus/es/components/skeleton/style/index",
      "element-plus/es/components/step/style/index",
      "element-plus/es/components/steps/style/index",
      "element-plus/es/components/sub-menu/style/index",
      "element-plus/es/components/switch/style/index",
      "element-plus/es/components/tab-pane/style/index",
      "element-plus/es/components/table-column/style/index",
      "element-plus/es/components/table/style/index",
      "element-plus/es/components/tabs/style/index",
      "element-plus/es/components/tag/style/index",
      "element-plus/es/components/text/style/index",
      "element-plus/es/components/time-picker/style/index",
      "element-plus/es/components/timeline-item/style/index",
      "element-plus/es/components/timeline/style/index",
      "element-plus/es/components/tooltip/style/index",
      "element-plus/es/components/tree-select/style/index",
      "element-plus/es/components/tree/style/index",
      "element-plus/es/components/upload/style/index",
      "element-plus/es/components/watermark/style/index",
    ],
  },
  //顶层的 esbuild 用于配置 *压缩* 行为
  esbuild: {
    // 删除所有注释 ('inline', 'eof', 'none', 'external')
    legalComments: "none",
    // 删除所有 console.*，debugger 断点
    drop: ["console", "debugger"],
  },
  // 构建配置
  build: {
    // 消除打包大小超过500kb警告
    chunkSizeWarningLimit: 2000,
    rollupOptions: {
      output: {
        // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
        entryFileNames: "js/[name].[hash].js",
        // 用于命名代码拆分时创建的共享块的输出命名
        chunkFileNames: "js/[name].[hash].js",
        // 用于输出静态资源的命名，[ext]表示文件扩展名
        assetFileNames: (assetInfo: any) => {
          const info = assetInfo.name.split(".");
          let extType = info[info.length - 1];
          // console.log('文件信息', assetInfo.name)
          if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name)) {
            extType = "media";
          } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)) {
            extType = "img";
          } else if (/\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name)) {
            extType = "fonts";
          }
          return `${extType}/[name].[hash].[ext]`;
        },
      },
    },
  },
});
